package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Wilson
 */
/************************************************ /
<parametros> ::= <tipos><y>{,<tipos><y>}
/*************************************************/
// IGO E FERNANDA DISCUTIRAM ESSE NÃO TERMINAL E PERCEBERAM QUE OS TOKENS DE SINCRONIZAÇÃO DESSE NÃO TERMINAL
// TEM "," , ")" E "{" PQ COM ESSES OS METODOS DA GENTE FUNCIONAM PERFEITAMENTE. SE FOREM MUDAR, NOS AVISE.
//
// Irei alterar esta classe, pois como Lauê me alertou, as chaves são fecho e naum sao terminais como eu havia
// pensado. Retirarei o reconhecimento das chaves.
// WIlsoooonnn!! Mudei algumas coisas aqui viu! 
public class parametros {

    Y y = new Y();
    Z z = new Z();

    public boolean sintaxeParametros(TabelaSimbolos tabelaSimbolos) {
        if (Tipos.apenasCompara(tabelaSimbolos)) {

            // salva o tipo
            tabelaSimbolos.salvaTipo(tabelaSimbolos.getLookahead());
            tabelaSimbolos.salvaItemListaParametro(tabelaSimbolos.getLookahead());

            tabelaSimbolos.soConsome();
//            if(tabelaSimbolos.getLookahead().equals("*"))
//                tabelaSimbolos.soConsome();//Consome o *

            

            if (y.y(tabelaSimbolos)) {

                // insere tipo
                // tabelaSimbolos.insertTipoVariavel();

                while (tabelaSimbolos.getLookahead().equals(",")) {
                    if (tabelaSimbolos.reconhecer(",")) {

                        // salva o tipo
                        tabelaSimbolos.salvaTipo(tabelaSimbolos.getLookahead());

                        if (Tipos.apenasCompara(tabelaSimbolos)) {
                            tabelaSimbolos.salvaItemListaParametro(tabelaSimbolos.getLookahead());
                            tabelaSimbolos.soConsome();

                            // insere tipo
//                            tabelaSimbolos.insertTipoVariavel();
//                            // insere o escopo
//                            tabelaSimbolos.insertEscopo();
//                            // insere categoria
//                            tabelaSimbolos.insertCategoria("variavel");

                            if (!y.y(tabelaSimbolos)) {
                                return false;
                            }
                        } else {
                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                            return false;//depois do identificador, não veio nem ; nem (
                        }
                    } else {
                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false;//depois do identificador, não veio nem ; nem (
                        }
                }

            } else {
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;//depois do identificador, não veio nem ; nem (
            }
        } else {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;//depois do identificador, não veio nem ; nem (
        }

        tabelaSimbolos.insereParametro();

        return true;
    }
}